package com.zoshine.zzg.util;



import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.ssl.DefaultHostnameVerifier;
import org.apache.http.conn.util.PublicSuffixMatcher;
import org.apache.http.conn.util.PublicSuffixMatcherLoader;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


public class HttpClientUtil {  
	

	private static  int connectionTimeout = 60 * 1000;
	
	private static  int soTimeout = 60 * 1000;
	
	
	
    private RequestConfig requestConfig = RequestConfig.custom()  
            .setSocketTimeout(soTimeout)  
            .setConnectTimeout(connectionTimeout)  
            .setConnectionRequestTimeout(connectionTimeout)  
            .build();  
      
    private static HttpClientUtil instance = new HttpClientUtil();  
    public HttpClientUtil(){}  
    public static HttpClientUtil getInstance(){  
        return instance;  
    }  
      
    /** 
     * 发送 post请求 
     * @param httpUrl 地址 
     * @throws Exception 
     */  
    public String sendHttpPost(String httpUrl) throws Exception {  
        HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost    
        return sendHttpPost(httpPost);  
    }  
      
    /** 
     * 发送 post请求 
     * @param httpUrl 地址 
     * @param params 参数(格式:key1=value1&key2=value2) 
     * @throws Exception 
     */  
    public String sendHttpPost(String httpUrl, String params) throws Exception {  
        HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost    
        try {  
            //设置参数  
            StringEntity stringEntity = new StringEntity(params, "UTF-8");  
            stringEntity.setContentType("application/x-www-form-urlencoded");  
            httpPost.setEntity(stringEntity);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return sendHttpPost(httpPost);  
    }  
      
    /** 
     * 发送 post请求 
     * @param httpUrl 地址 
     * @param maps 参数 
     * @throws Exception 
     */  
    public String sendHttpPost(String httpUrl, Map<String, Object> maps) throws Exception {
        HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost    
        // 创建参数队列    
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
        for (String key : maps.keySet()) {
            nameValuePairs.add(new BasicNameValuePair(key, maps.get(key).toString()));
        }  
        try {  
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));  
            
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return sendHttpPost(httpPost);  
    }  
      
      
    /** 
     * 发送 post请求（带文件） 
     * @param httpUrl 地址 
     * @param maps 参数 
     * @param fileLists 附件 
     * @throws Exception 
     */  
    public String sendHttpPost(String httpUrl, Map<String, String> maps, List<File> fileLists) throws Exception {  
        HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost    
        MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create();  
        for (String key : maps.keySet()) {  
            //meBuilder.addPart(key, new StringBody(URLEncoder.encode(maps.get(key), "utf-8"), ContentType.TEXT_PLAIN));  
        } 
        if (fileLists != null)
        {
	        for(File file : fileLists) {  
	            FileBody fileBody = new FileBody(file);  
	            meBuilder.addPart("files", fileBody);  
	        }  
        }
        HttpEntity reqEntity = meBuilder.build();  
        httpPost.setEntity(reqEntity);  
        return sendHttpPost(httpPost);  
    }  
      
    /** 
     * 发送Post请求 
     * @param httpPost 
     * @return 
     * @throws Exception 
     */  
    private String sendHttpPost(HttpPost httpPost) throws Exception {  
        CloseableHttpClient httpClient = null;  
        CloseableHttpResponse response = null;  
        HttpEntity entity = null;  
        String responseContent = null;  
        try {  
            // 创建默认的httpClient实例.  
            httpClient = HttpClients.createDefault();  
            httpPost.setConfig(requestConfig);  
            // 执行请求  
            response = httpClient.execute(httpPost); 
            entity = response.getEntity();	   
            responseContent = EntityUtils.toString(entity, "UTF-8");  
            if (response.getStatusLine().getStatusCode() != 200)//响应失败
            {	
            	throw new RuntimeException(responseContent);
            }
        } catch (Exception e) {  
        	throw e;
        } finally {  
            try {  
                // 关闭连接,释放资源  
                if (response != null) {  
                    response.close();  
                }  
                if (httpClient != null) {  
                    httpClient.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return responseContent;  
    }  
    
    
    
  /** 
   * 发送 post请求 
   * @param httpUrl 地址 
   * @param maps 参数 
   * @param localPathFile 文件临时存储目录
   * @throws Exception 
   */  
  public void sendHttpFilePost(String httpUrl, Map<String, String> maps,  String localPathFile) throws Exception {  
      HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost    
      // 创建参数队列    
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
      for (String key : maps.keySet()) {  
          nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));  
      } 
      
      FileOutputStream output = null;
      InputStream input = null;
      
      try 
      {  
          httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));  

          CloseableHttpClient httpClient = null;  
          CloseableHttpResponse response = null;  
          HttpEntity entity = null;  
          String responseContent = null;  
          try {  
              // 创建默认的httpClient实例.  
              httpClient = HttpClients.createDefault();  
              httpPost.setConfig(requestConfig);  
              // 执行请求  
              response = httpClient.execute(httpPost);  
              if (response.getStatusLine().getStatusCode() != 200)//响应失败
              {	
              		throw new RuntimeException(responseContent);
              }
                          
              entity = response.getEntity();	             
              input = entity.getContent();
              Header header=entity.getContentType();
              if("multipart/form-data;charset=UTF-8".equals(header.getValue().toString())){
              	System.out.println(header.getValue().toString()+"下载文件");
              
              	File file = new File(localPathFile);
                output = new FileOutputStream(file);
                int length;
                byte[] tmp = new byte[1024];
                while ((length = input.read(tmp)) != -1) {
              	  output.write(tmp, 0, length);
                    
                }
                output.flush();
              }else{
                	System.out.println("json");
                }
          } catch (Exception e) {  
          	throw e;
          } finally {  
              try 
              {  
              
            	  
                  if (input != null)
                  {
                  	input.close();
                  }
                  
                  if (output != null)
                  {
                  	output.close();
                  }
            	  
            	  
            	  // 关闭连接,释放资源  
                  if (response != null) {  
                      response.close();  
                  }  
                  if (httpClient != null) {  
                      httpClient.close();  
                  }  
 
                  
              } catch (IOException e) {  
                  e.printStackTrace();  
              }  
          } 
          
          
      } catch (Exception e) {  
          e.printStackTrace();  
      }  

  }  
    
    
  
    /** 
     * 发送 get请求 
     * @param httpUrl 
     */  
    public String sendHttpGet(String httpUrl) {  
        HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求  
        return sendHttpGet(httpGet);  
    }  
      
    /** 
     * 发送 get请求Https 
     * @param httpUrl 
     */  
    public String sendHttpsGet(String httpUrl) {  
        HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求  
        return sendHttpsGet(httpGet);  
    }  
      
    /** 
     * 发送Get请求 
     * @param httpPost 
     * @return 
     */  
    private String sendHttpGet(HttpGet httpGet) {  
        CloseableHttpClient httpClient = null;  
        CloseableHttpResponse response = null;  
        HttpEntity entity = null;  
        String responseContent = null;  
        try {  
            // 创建默认的httpClient实例.  
            httpClient = HttpClients.createDefault();  
            httpGet.setConfig(requestConfig);  
            // 执行请求  
            response = httpClient.execute(httpGet);  
            entity = response.getEntity();  
            responseContent = EntityUtils.toString(entity, "UTF-8");  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                // 关闭连接,释放资源  
                if (response != null) {  
                    response.close();  
                }  
                if (httpClient != null) {  
                    httpClient.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return responseContent;  
    }  
      
    /** 
     * 发送Get请求Https 
     * @param httpPost 
     * @return 
     */  
    private String sendHttpsGet(HttpGet httpGet) {  
        CloseableHttpClient httpClient = null;  
        CloseableHttpResponse response = null;  
        HttpEntity entity = null;  
        String responseContent = null;  
        try {  
            // 创建默认的httpClient实例.  
            PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new URL(httpGet.getURI().toString()));  
            DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);  
            httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build();  
            httpGet.setConfig(requestConfig);  
            // 执行请求  
            response = httpClient.execute(httpGet);  
            entity = response.getEntity();  
            responseContent = EntityUtils.toString(entity, "UTF-8");  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                // 关闭连接,释放资源  
                if (response != null) {  
                    response.close();  
                }  
                if (httpClient != null) {  
                    httpClient.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return responseContent;  
    }
    
    /** 
     * 发送Get请求Https 
     * @param httpPost 
     * @return 
     */  
    public void sendFileHttpGet(HttpGet httpGet, String localPathFile) {  
        
        CloseableHttpClient httpClient = null;  
        CloseableHttpResponse response = null;  
        HttpEntity entity = null;  
        FileOutputStream output = null;
        InputStream input = null;

        try {  
        	output = new FileOutputStream(new File(localPathFile));       	
            // 创建默认的httpClient实例.  
            httpClient = HttpClients.createDefault();  
            httpGet.setConfig(requestConfig);  
            // 执行请求  
            response = httpClient.execute(httpGet);  
            entity = response.getEntity(); 
            input = entity.getContent();
            
            int length;
            byte[] tmp = new byte[1024];
            while ((length = input.read(tmp)) != -1) {
            	output.write(tmp, 0, length);
                
            }
            output.flush();
            
        } catch (Exception e) {  
        } finally {  
            try {  
                // 关闭连接,释放资源  
                if (response != null) {  
                    response.close();  
                }  
                if (httpClient != null) {  
                    httpClient.close();  
                }  
                
                if (input != null)
                {
                	input.close();
                }
                
                if (output != null)
                {
                	output.close();
                }
                
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
       
  
    } 
    
    /** 
     * 发送Get请求Https 
     * @param httpPost 
     * @return 
     */  
    public void sendFileHttpsGet(HttpGet httpGet, String localFilePath) {  
        CloseableHttpClient httpClient = null;  
        CloseableHttpResponse response = null;  
        HttpEntity entity = null;  
        
        InputStream in = null;
        FileOutputStream fout = null;
        
        try {  
            // 创建默认的httpClient实例.  
            PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new URL(httpGet.getURI().toString()));  
            DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);  
            httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build();  
            httpGet.setConfig(requestConfig);  
            // 执行请求  
            response = httpClient.execute(httpGet);  
            entity = response.getEntity();  
            
            in = entity.getContent();
            
            File file = new File(localFilePath);
            fout = new FileOutputStream(file);
            int length;
            byte[] tmp = new byte[1024];
            while ((length = in.read(tmp)) != -1) {
                fout.write(tmp, 0, length);
                
            }
            fout.flush();
        } catch (Exception e) {  
        	throw new RuntimeException(e);
        } finally {  
            try {  
            	
            	if (in != null)
            	{
            		in.close();
            	}
            	
            	if (fout != null)
            	{
            		fout.close();
            	}
                // 关闭连接,释放资源  
                if (response != null) {  
                    response.close();  
                }  
                if (httpClient != null) {  
                    httpClient.close();  
                }  
            } catch (IOException e) {    
            }  
        }  
  
    }


}  